﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
using System.IO.Ports;
using System.IO;

namespace LeTranNam
{
    public partial class frmMain : Form
    {
        //DataClasses1DataContext db = new DataClasses1DataContext();
        static int range = 1000;// phạm vi tọa độ nhập vào từ 0-1000
        static float size = 500;// kích thước của picturebox là 500x500
        static float ration = size / range;// tỉ lệ để hiển thị cho đúng vị trí tọa độ lên picturebox
        PointF p1 = new PointF();
        PointF p2 = new PointF();
        PointF p3 = new PointF();
        bool codiem1 = false;
        bool codiem2 = false;
        bool codiem3 = false;
        
        SerialPort serialPort;
        byte[] StoreData;
        byte[] TempData;
        int iIndex = 0;
        bool BeginStatus = true;
        bool EndStatus = false;

        public frmMain()
        {
            InitializeComponent();
        }

        private void frmMain_Load(object sender, EventArgs e)
        {
            if (SerialPort.GetPortNames().Length == 0) MessageBox.Show("Chưa kết nối với thiết bị", "Thông báo", MessageBoxButtons.OK);
            else
            {
                if (SerialPort.GetPortNames().Length > 1)
                {
                    SettingSerialPort frmSetting = new SettingSerialPort();
                    frmSetting.ShowDialog();
                }
                else
                {
                    StaticValue.PortName = SerialPort.GetPortNames()[0];
                }
                serialPort = new SerialPort(StaticValue.PortName);
                SetData(serialPort);
                serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
                serialPort.Open();

                StoreData = new byte[50];
                TempData = new byte[10];
            }

            DataClasses1DataContext db = new DataClasses1DataContext();
            
            // lấy ra 3 điểm trong database theo ID của điểm ghi ở combobox (ID từ 1-9 nên chỉ có 9 điểm)
            tbDiem d1 = db.tbDiems.Single(p => p.ID == 1);
            tbDiem d2 = db.tbDiems.Single(p => p.ID == 2);
            tbDiem d3 = db.tbDiems.Single(p => p.ID == 3);

            // tọa độ (tính theo pixel nên có nhân với ration )
            // mỗi string chỉ tọa độ trong database có độ dài là 6 trong đó
            // 3 chữ số đầu chỉ tọa độ trên trục ox, 3 cái sau chỉ tọa độ trên trục oy
            // ví dụ: 1 dòng trong databse ghi ID=1 ứng với tọa độ là chuỗi "123456" thì x=123 y=456
            p1.X = ration * Convert.ToInt32(d1.toado.Substring(0, 3));
            p1.Y = ration * Convert.ToInt32(d1.toado.Substring(3, 3));

            p2.X = ration * Convert.ToInt32(d2.toado.Substring(0, 3));
            p2.Y = ration * Convert.ToInt32(d2.toado.Substring(3, 3));

            p3.X = ration * Convert.ToInt32(d3.toado.Substring(0, 3));
            p3.Y = ration * Convert.ToInt32(d3.toado.Substring(3, 3));

            

            Control.CheckForIllegalCrossThreadCalls = false;
        }

        
        void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            // Xử lý lúc nhận được dữ liệu
            serialPort.Read(TempData, 0, 10);

            string test = "";
            for (int i = 0; i < 10; i++)
            {
                test += " " + TempData[i].ToString();
            }
            listBox1.Items.Add(test);


            if (BeginStatus)
            {
                if (Convert.ToInt16(TempData[0]) > 0)
                {
                    for (int i = 0; i < 10; i++)
                    {
                        // Xem xem có dữ liệu hay không
                        if (Convert.ToInt16(TempData[0]) > 0)
                        {
                            // Đưa vào buffer để xử lý
                            StoreData[iIndex] = TempData[i];

                            // Kiểm tra trạng thái kết thúc bản tin
                            if (EndStatus)
                            {
                                // Xử lý khi kết thúc bản tin
                                if (Convert.ToInt16(TempData[0]) == 10)
                                {
                                    txtWind.Text = Convert.ToInt16(StoreData[14]).ToString();
                                    txtDoam.Text = Convert.ToInt16(StoreData[15]).ToString();
                                    txtDegree.Text = Convert.ToInt16(StoreData[16]).ToString();

                                    txtDataReceive.Text = UnicodeEncoding.ASCII.GetString(StoreData);
                                }
                            }
                            else
                            {
                                // Nếu như có dấu hiệu kết thúc bản tin
                                if (Convert.ToInt16(TempData[0]) == 13) EndStatus = true;
                            }
                            iIndex++;
                            
                        }
                        else break;
                    }
                }
                else
                {
                    StoreData[iIndex] = TempData[0];
                    iIndex++;
                }
            }
        }

        private void SetData(SerialPort srP)
        {
            srP.BaudRate = 9600;
            srP.Parity = Parity.None;
            srP.DataBits = 8;
            srP.StopBits = StopBits.One;
        }

        private void ReadSettingData()
        {
            // Đọc dữ liệu ban đầu
            if (File.Exists(@"C:\setting.txt"))
                try
                {
                    FileStream fs = File.Open(@"C:\setting.txt", FileMode.Open);
                    StreamReader sr = new StreamReader(fs);
                    StaticValue.PortName = sr.ReadLine();
                    StaticValue.BauRate = int.Parse(sr.ReadLine());
                    StaticValue.DataBit = int.Parse(sr.ReadLine());
                    StaticValue.Parity = sr.ReadLine();
                    StaticValue.StopBit = sr.ReadLine();

                    sr.Close();
                    fs.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            else
            {
                StaticValue.BauRate = 9600;
                StaticValue.Parity = "None";
                StaticValue.DataBit = 8;
                StaticValue.StopBit = "One";
            }
        }

        private void display()
        {
            Image img = new Bitmap(500, 500);
            Graphics g = Graphics.FromImage(img);

            if (codiem1 == true)
            {
                g.FillEllipse(Brushes.Black, p1.X, p1.Y, 10, 10);
                pbxShowData.Image = img;
                panel1.Hide();
                pnStatus.Show();
                pbxShowData.Show();
                Thread.Sleep(3000);
            }

            if (codiem2 == true)
            {
                g.FillEllipse(Brushes.Black, p2.X, p2.Y, 10, 10);
                pbxShowData.Image = img;
                pbxShowData.Show();
                Thread.Sleep(3000);
            }

            if (codiem1 == true & codiem2 == true)
            {
                g.DrawLine(Pens.Black, p1, p2);
                pbxShowData.Image = img;
                pbxShowData.Show();
                Thread.Sleep(3000);
            }

            if (codiem3 == true)
            {
                g.FillEllipse(Brushes.Black, p3.X, p3.Y, 10, 10);
                pbxShowData.Image = img;
                pbxShowData.Show();
                Thread.Sleep(3000);
            }

            if (codiem2 == true & codiem3 == true)
            {
                g.DrawLine(Pens.Black, p2, p3);
                pbxShowData.Image = img;
                pbxShowData.Show();
                Thread.Sleep(3000);
            }

            if (codiem3 == true & codiem1 == true)
            {
                g.DrawLine(Pens.Black, p1, p3);
                pbxShowData.Image = img;
                pbxShowData.Show();
                Thread.Sleep(3000);
            }            
        }

        private void btSettingSerialPort_Click(object sender, EventArgs e)
        {
            SettingSerialPort s = new SettingSerialPort();
            s.ShowDialog();
        }

        private void btnExit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void pbxShowData_Paint(object sender, PaintEventArgs e)
        {
            // 4 lệnh sau để hình vẽ đẹp hơn, xóa đi ko sao
            e.Graphics.CompositingQuality = CompositingQuality.HighQuality;
            e.Graphics.InterpolationMode = InterpolationMode.Bicubic;
            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
            e.Graphics.TextRenderingHint = TextRenderingHint.AntiAlias;

            // màu nền của picturebox là đen
            pbxShowData.BackColor = Color.LightGreen;

            /// Vẽ trục ox và oy
            e.Graphics.DrawLine(Pens.Yellow, 0, 0, size, 0);
            e.Graphics.DrawLine(Pens.Yellow, 0, 0, 0, size);

            // Vẽ đường gạch gạch cho trục ox và oy
            for (int i = 0; i < 10; i++)
            {
                e.Graphics.DrawLine(Pens.Red, i * size / 10, 0, i * size / 10, 500);
                //gạch gạch này dài 3pixel
            }
            for (int i = 0; i < 10; i++)
            {
                e.Graphics.DrawLine(Pens.Red, 0, i * size / 10, 500, i * size / 10);
            }

            // Vẽ ký tự 0-9 cho trục ox và oy
            for (int i = 0; i < 10; i++)
            {
                e.Graphics.DrawString(Convert.ToString(i), new Font(this.Font, FontStyle.Bold), Brushes.Red,
                   i * size / 10, 0);
            }

            for (int i = 0; i < 10; i++)
            {
                e.Graphics.DrawString(Convert.ToString(i), new Font(this.Font, FontStyle.Bold), Brushes.Red,
                   0, i * size / 10);
            }
        }
    }
}
